function [ B, D] = BPSelection( P, m, distance )
% P-przyklady ulozone wierszami (jeden wiersz jeden przyklad)
% m-liczba przykladow do wybrania
% B-indeksy wybranych z P elementow
% D-tablica odleglosci pomiedzy poszczegolnymi B, a P
    if nargin<3
        distance=@EuclideanDistance;
    end
    [Pn, Pm]=size(P);
    %jesli m jest wieksze od |P| to je zmniejsz
    m=min(m, Pn);
    %rezerwacja pamieci
    D=zeros(Pn, m);
    B=zeros(1,m);
    %tablica na sume wyliczanych odleglosci
    A=zeros(Pn,1);
    %tablica indeksow ktore sa brane pod uwage przy obliczaniu kolejnych
    %wartosci wektora A
    Pindex=2:Pn;
    %sprawdzenie czy cos trzeba szukac
    if m>0
        %jako pierwszy bierzemy pod uwage pierwszy w tablicy P
        b=1;
        B(1)=b;
        %aktualizujemy tablice odleglosci
        D(:,1)=distance(P, P(b,:));
        for i=2:m
            %aktualizujemy A
            A(Pindex)=A(Pindex)+D(Pindex,i-1);
            %znajdujemy maksimum
            [garbage, I]=max(A(Pindex));
            %wprowadzamy znaleziony indeks do B
            b=Pindex(I(1));
            Pindex(I(1))=[];
            B(i)=b;
            %aktualizujemy odleglosci
            D(:,i)=EuclideanDistance(P, P(b,:));
        end
    end

end

